import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios)
import { Toast } from 'vant'
import router from '../router/index.js'
//axios拦截器
import { getToken, saveToken, removeToken } from './token.js' //先导入
import JSONbig from 'json-bigint'
//配置基地址
const instance = axios.create({
    // baseURL: 'http://ttapi.research.itcast.cn/app',
    baseURL: 'http://toutiao-app.itheima.net',
    timeout: 5000,

    //大数精度丢失
    // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
    transformResponse: [
        function(data) {
            // 对 data 进行任意转换处理
            try {
                return JSONbig.parse(data)
            } catch (error) {
                return data //这里不要写JSON.parse(data)
            }
        }
    ]
})

// 添加请求拦截器
//这里是用instance发的 所以axios要改成instance
instance.interceptors.request.use(
    function(config) {
        // 在发送请求之前做些什么

        if (getToken()) {
            //如果有token  就给请求中全部加上token
            config.headers.Authorization = `Bearer ${getToken().token}`
        }
        return config
    },
    function(error) {
        // 对请求错误做些什么
        return Promise.reject(error)
    }
)

// 添加响应拦截器
instance.interceptors.response.use(
    function(response) {
        // 对响应数据做点什么
        return response
    },
    async function(error) {
        // 对响应错误做点什么
        if (error.response.status == 401) {
            if (getToken()) {
                try {
                    //有token但是token过期了
                    let res = await axios({
                            //必须用axios发请求 1、instance设置了基地址 2、前面设置了请求拦截
                            //重新用refresh-token发请求获取token
                            url: 'http://toutiao-app.itheima.net/v1_0/authorizations',
                            method: 'get',
                            headers: {
                                Authorization: `Bearer ${getToken().refresh_token}`
                            }
                        })
                        //修改token值
                    getToken().token = res.data.data.refresh_token
                        //保存token
                    saveToken(getToken().token)
                        //用户真正看到效果的是这一步，用修改过的数据重新发送请求
                    return instance(error.config) //这里又要用instance了
                } catch (error) {
                    //到这一步说明refreshtoken也过期了
                    Toast.fail('请先登录')
                        //移除token
                    removeToken()
                    router.push({ path: '/login' })
                }
            } else {
                Toast.fail('请先登录')
                router.push({ path: '/login' })
            }
        } else {
            //什么也不用操作
        }
        return Promise.reject(error)
    }
)

export default instance